﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Web.Security;

namespace PizzaWic.user
{
    public class SqlAccess
    {
        private String connect = "Data Source=localhost\\SQLEXPRESS;Initial Catalog=PizzaWic;Integrated Security=SSPI;Trusted_Connection=True;";

        private Object[] addParamCustomer = { "name", "surname", "login", "password", "phone_number", "mail", "number" ,"street","city","area_code"};

        internal bool addCustomer(object[] parameters)
        {
            Object[,] param = new Object[2, addParamCustomer.Length];
            for (int i = 0; i < parameters.Length; i++)
            {
                param[1, i] = parameters[i];
                param[0, i] = addParamCustomer[i];
            }
            SqlConnection sqlConnection = dbConnect();
           psExecute(sqlConnection, "customer_insert", param);
            sqlConnection.Close();
            return true;
        }

        /// <summary>
        /// renvoi tous les products
        /// </summary>
        /// <returns></returns>
        protected internal DataSet getAllProducts()
        {
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "product_read", null);
            sqlConnection.Close();
            return dataSet;
        }

        /// <summary>
        /// renvoi la liste des raw material pour un produit donné
        /// </summary>
        /// <param name="parameters">liste des valeurs des paramètres (id_product)</param>
        /// <returns></returns>
        protected internal DataSet getRawMaterialByProduct(Object[] parameters)
        {
            Object[,] param = new Object[2, 1];

            param[1, 0] = parameters[0];
            param[0, 0] = "id_product";

            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "raw_material_by_product", param);
            sqlConnection.Close();
            return dataSet;
        }

        /// <summary>
        /// permet de se connecter à la base
        /// </summary>
        /// <returns>un objet SqlConnection pour se deconnecter à la fin de la transaction</returns>
        private SqlConnection dbConnect()
        {
            SqlConnection sqlConnection = new SqlConnection();
            sqlConnection.ConnectionString = connect;
            sqlConnection.Open();
            return sqlConnection;
        }


        /// <summary>
        /// permet d'exuter une procédure stockée
        /// </summary>
        /// <param name="sqlConnection"></param>
        /// <param name="ps">le nom de la procédure stockée</param>
        /// <param name="parameters">les paramètres de la procédure stockée</param>
        /// <returns>retourne éventuellement le résultat de la requète</returns>
        private DataSet psExecute(SqlConnection sqlConnection, String ps, Object[,] parameters)
        {
            SqlCommand sqlCommand = new SqlCommand();
            sqlCommand.Connection = sqlConnection;
            sqlCommand.CommandType = CommandType.StoredProcedure;
            sqlCommand.CommandText = ps;

            if (parameters != null)
                for (int i = 0; i < parameters.GetLength(1); i++)
                {
                    SqlParameter sqlParameter = new SqlParameter();
                    sqlParameter.ParameterName = (String)parameters[0, i];
                    sqlParameter.Value = parameters[1, i];
                    sqlCommand.Parameters.Add(sqlParameter);
                }

            DataSet dataSet = new DataSet();
            SqlDataAdapter sqlDataAdaptater = new SqlDataAdapter();
            sqlDataAdaptater.SelectCommand = sqlCommand;
            sqlDataAdaptater.Fill(dataSet);

            return dataSet;
        }

        internal DataSet getLoginFree(string login)
        {
            Object[,] param = new Object[2, 1];

            param[1, 0] = login;
            param[0, 0] = "login";

            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "user_login_free", param);
            sqlConnection.Close();
            return dataSet;
        }

        ///////////////////////////////////////////////////////////////////////////
        /// <summary>
        /// Permet de récupérer l'id d'un utilisateur enregistré.
        /// </summary>
        /// <param name="login">login de l'utilisateur enregistré.</param>
        /// <returns>int id de l'utilisateur enregistré.</returns>
        public int getUserId(String login)
        {
            int id = 0;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "user_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                String loginTest = dataSet.Tables[0].Rows[i].ItemArray[3].ToString();
                int idTest = (int)dataSet.Tables[0].Rows[i].ItemArray[0];
                if (loginTest.Equals(login))
                    id = idTest;
            }
            sqlConnection.Close();
            return id;

        }

        /// <summary>
        /// Permet de vérifier si un utilisateur enregistré est affilié au rôle "customer".
        /// </summary>
        /// <param name="id">int id de l'utilisateur enregistré.</param>
        /// <returns>true si l'utilisateur est un customer.</returns>
        public Boolean isCustomer(int id)
        {
            Boolean result = false;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "customer_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                int userId = (int)dataSet.Tables[0].Rows[i].ItemArray[3];

                if (userId == id)
                    result = true;
            }
            sqlConnection.Close();
            return result;
        }

        /// <summary>
        /// Permet de récupérer le customerId d'un user enregistré en tant que customer
        /// </summary>
        /// <param name="userId">Id d'un user enregistré</param>
        /// <returns>Renvoie un customerId</returns>
        public int getCustomerId(int userId)
        {
            int customerId = 0;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "customer_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                int idCustomerTest = (int)dataSet.Tables[0].Rows[i].ItemArray[0];
                int idUserTest = (int)dataSet.Tables[0].Rows[i].ItemArray[3];
                if (userId == idUserTest)
                    customerId = idCustomerTest;
            }
            sqlConnection.Close();
            return customerId;
        }


        /// <summary>
        /// Permet de vérifier si un utilisateur donné est un cuisinier.
        /// </summary>
        /// <param name="id">Id d'utilisateur enregistré.</param>
        /// <returns>Vrai si l'id spécifié appartient à un cuisinier. Faux
        ///  sinon</returns>
        public Boolean isCooker(int id)
        {
            Boolean result = false;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "cook_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                int userId = (int)dataSet.Tables[0].Rows[i].ItemArray[1];

                if (userId == id)
                    result = true;
            }
            sqlConnection.Close();
            return result;
        }

        /// <summary>
        /// Permet de récupérer le cookerId d'un cuisinier qu'on sait existant.
        /// </summary>
        /// <param name="userId">Id d'utilisateur enregistré.</param>
        /// <returns>Renvoie de cookerId du cuisinier.</returns>
        public int getCookerId(int userId)
        {
            int cookerId = 0;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "cook_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                int idCookerTest = (int)dataSet.Tables[0].Rows[i].ItemArray[0];
                int idUserTest = (int)dataSet.Tables[0].Rows[i].ItemArray[1];
                if (userId == idUserTest)
                    cookerId = idCookerTest;
            }
            sqlConnection.Close();
            return cookerId;
        }

        /// <summary>
        /// Vérifie si un utilisateur enregistré est administrateur.
        /// </summary>
        /// <param name="id">Id d'utilisateur enregistré.</param>
        /// <returns>Vrai si l'utilisateur est enregistré en tant que cuisinier.
        /// Faux sinon.</returns>
        public Boolean isAdministrator(int id)
        {
            Boolean result = false;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "administrator_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                int userId = (int)dataSet.Tables[0].Rows[i].ItemArray[1];

                if (userId == id)
                    result = true;
            }
            sqlConnection.Close();
            return result;
        }

        /// <summary>
        /// Permet de charger l'intégralité de la base des users dans un objet Dataset.
        /// </summary>
        /// <returns>Un Dataset.</returns>
        public DataSet getRegisterUserList()
        {
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "user_read", null);
            sqlConnection.Close();
            //Console.WriteLine(dataSet.ToString());
            return dataSet;
        }


        /// <summary>
        /// Permet, à partir d'un login d'utilisateur existant, de récupérer son prénom
        /// </summary>
        /// <param name="login">Login utilisateur enregistré.</param>
        /// <returns>Une string contenant le prénom utilisé lors de l'enregistrement.</returns>
        public String getName(String login)
        {
            String name = "";
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "user_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                String loginTest = dataSet.Tables[0].Rows[i].ItemArray[3].ToString();
                String nameTest = dataSet.Tables[0].Rows[i].ItemArray[1].ToString();
                if (loginTest.Equals(login))
                    name = nameTest;
            }
            sqlConnection.Close();
            return name;

        }

        /// <summary>
        /// Vérifie si les informations rentrées dans le champ de connexion correspondent
        /// à un utilisateur présent en base de donnée.
        /// </summary>
        /// <param name="login">Login.</param>
        /// <param name="password">Password.</param>
        /// <returns>True si l'utilisateur existe en base. Faux sinon.</returns>
        public Boolean isRegistered(String login, String password)
        {

            password = FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5");
            Boolean registred = false;
            SqlConnection sqlConnection = dbConnect();
            DataSet dataSet = psExecute(sqlConnection, "user_read", null);
            for (int i = 0; i < dataSet.Tables[0].Rows.Count; i++)
            {
                String loginTest = dataSet.Tables[0].Rows[i].ItemArray[3].ToString();

                if (loginTest.Equals(login))
                {

                    String passwordTest = dataSet.Tables[0].Rows[i].ItemArray[4].ToString();
                    if (passwordTest.Equals(password))
                        registred = true;
                }
            }
            sqlConnection.Close();
            return registred;
        }
    }
}
